package com.wfy.common.security.filter;

import com.google.gson.Gson;
import com.wfy.common.config.Global;
import com.wfy.common.entity.Result;
import com.wfy.common.entity.ResultGenerate;
import com.wfy.common.security.shiro.utils.ShiroHolder;
import com.wfy.common.util.Servlets;
import com.wfy.common.util.StringUtils;
import com.wfy.modules.sys.secutiry.PrincipalUser;
import org.apache.shiro.web.servlet.AdviceFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created with IntelliJ IDEA.
 *
 * @author: wangxindong
 * @date: 2018/5/27-10:18
 */
public class ShiroLoginFilter extends AdviceFilter {

    // ================================================================
    // Constants
    // ================================================================

    // ================================================================
    // Fields
    // ================================================================


    // ================================================================
    // Constructors
    // ================================================================

    // ================================================================
    // Methods from/for super Interfaces or SuperClass
    // ================================================================

    /**
     * @param request
     * @param response
     * @return true--过滤器链继续执行， false--过滤器链不执行
     * @throws Exception
     */
    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        String sessionId = httpServletRequest.getHeader(Global.AUTHORIZATION);
        String url = httpServletRequest.getRequestURI();
        if (url.contains(Global.LOGIN_URL)) {
            return true;
        }

        if (StringUtils.isEmpty(sessionId)) {
            Servlets.writeResponse(httpServletResponse, getNotLoginResult());
            return false;
        } else {
            PrincipalUser user = ShiroHolder.getUser();
            if (null == user) {
                Servlets.writeResponse(httpServletResponse, getNotLoginResult());
                return false;
            } else {
                return true;
            }
        }
    }


    private String getNotLoginResult() {
        Result result = ResultGenerate.getNotLoginResult();
        String value = new Gson().toJson(result);
        return value;
    }

    // ================================================================
    // Public or Protected Methods
    // ================================================================


    // ================================================================
    // Getter & Setter
    // ================================================================

    // ================================================================
    // Private Methods
    // ================================================================


    // ================================================================
    // Inner or Anonymous Class
    // ================================================================

    // ================================================================
    // Test Methods
    // ================================================================

}
